package Moteur;

import v1.Horloge;
import v1.HorlogeImpl;
import Commande.CmdStart;
import IHM.Afficheur;
import IHM.AfficheurImpl;
import IHM.Molette;

public class Controler implements Observer{

	MoteurMetronome moteur;
	Afficheur afficheur;
	Horloge horloge;

	public Controler(MoteurMetronome moteur) {
		this.moteur = moteur;
		afficheur = new AfficheurImpl();
		horloge = new HorlogeImpl();
	}

	/**
	 * Permet de demarrer le metronome
	 */
	public void start() {
		if(!moteur.getEtatMarche()){
			moteur.setEtatMarche(true);
			moteur.notifyObserver();
		}
	}
	
	/**
	 * Permet d arreter le metronome
	 */
	public void stop() {
		if(moteur.getEtatMarche()){
			moteur.setEtatMarche(false);
			moteur.notifyObserver();
		}
	}

	/**
	 * Permet de marquer un temps
	 */
	public void marquerTemps() {
		afficheur.allumerLED(1);
	}
	
	public Afficheur getAfficheur() {
		return afficheur;
	}

	
	/**
	 * Permet de marquer une mesure
	 */
	public void marquerMesure() {
		afficheur.allumerLED(0);
	}

	public void decrease() {
		moteur.decrease();
	}

	public void increase() {
		moteur.increase();	
	}

	@Override
	public void updateMolette(Integer valeur) {
		float position = afficheur.getMolette().getValue();
		float positionTemp = (position/100);
		float tempo = 40+(120-40)*positionTemp;
		int tempoTemp = (int) tempo;
		moteur.setTempo(tempoTemp);
	}

	@Override
	public void updateTempo(Integer valeur) {
		int tempo = (int) moteur.getTempo();
		afficheur.afficherTempo(tempo);
		stop();
		start();
	}

	@Override
	public void update() {
		if(moteur.getEtatMarche()){			
			horloge.activerPeriodiquement(moteur.getCommandeMarquerTemps(), Float.parseFloat(moteur.getTempo()+""));
			horloge.activerApresDelai(moteur.getCommandeMarquerMesure(), Float.parseFloat( moteur.getTempo()+""), moteur.getNbTempsParMesure());
		}else{
			horloge.stopHorloge();
		}
	}

}
